package hn.cch.job;

import hn.cch.constant.Common;
import hn.cch.constant.Path;
import hn.cch.util.DateUtil;
import hn.cch.util.FtpUtil;
import org.apache.commons.net.ftp.FTPClient;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.Date;
import java.util.List;

/**
 * 文件任务：读取FTP服务器文件并处理文件内容
 *
 * 文件类型：
 *   1.*.text:内容文件
 *     文件名称：使用_作为分隔符
 * 文件是按天生成并每天一个
 * 文件名称前缀+当天的日期+文件名称前缀
 * file_20201212.text
 *     文件内容：
 * 没有记录的文件内容:|
 * 每行记录：使用|作为分隔符
 * 0|1|2|3|4|5|6|7|8|9
 *
 *
 *   2.*.flag:标志文件
 * file_20201212.flag
 * 文件内容：|
 */
public class FileJob implements Job {
    
    private static Logger logger = LoggerFactory.getLogger(FileJob.class);
    

    
    
    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {

        logger.info("file job start");
        
        //FTP服务器
        FTPClient fromFTP = FtpUtil.openFtp(Path.from_ftp_host, Path.from_ftp_port, Path.from_ftp_username, Path.from_ftp_password);
    
        FTPClient toFTP = FtpUtil.openFtp(Path.to_ftp_host, Path.to_ftp_port, Path.to_ftp_username, Path.to_ftp_password);
    
        //获取所有要处理的日期
        List<String> days = DateUtil.getDays(new Date(), Path.file_ago_day);
        
        if (!FtpUtil.changePath(fromFTP, Path.from_ftp_path)){
            logger.error("file job error:" + Path.from_ftp_path);
            return;
        }
        /**
         * 按天处理每天数据
         * 按行处理每条记录
         */
        for (String day:days) {
            
            
            
            String textName = Path.file_name_prefix + Path.file_name_separator + Path.access_name_code + Path.file_name_separator + day + Path.text_name_suffix;
            String flagName = Path.file_name_prefix + Path.file_name_separator + Path.access_name_code + Path.file_name_separator + day+ Path.flag_name_suffix;
            
            if (!(FtpUtil.fileExist(fromFTP, flagName) && FtpUtil.fileExist(fromFTP, textName))){
                //文件不存在
                logger.error("file not exist");
                return;
            }
            String flagString = FtpUtil.readFile(fromFTP, flagName);
            if (flagString.equals(Path.file_text_separator)){
                //文件不完整
                logger.error("file not complete");
                return;
            }
            String textString = FtpUtil.readFile(fromFTP, textName);
            if (textString.equals(Path.file_text_separator)){
                //文件无记录
                logger.error("file no record");
                return;
            }
            
            //校验记录
            String[] textRecords = textString.split(Common.LINE);
            for (String textRecord:textRecords) {
                //校验字段
                String[] textFields = textRecord.split(Path.file_text_separator);
                if (textFields.length != 10){
                    //记录字段错误
                    logger.error("record field error");
                    return;
                }
                
                
                //处理字段记录
                
                /**
                 *
                 * 字段解释说明
                 *
                 *
                 * 记录ID
                 * 玩法ID
                 * 用户ID
                 * 通道ID
                 * 彩票ID
                 * 日期
                 * 时间
                 * 城市
                 * 票价
                 * 标志
                 *
                 * 插入数据库
                 *
                 */
    
                logger.info("handle record start");

    
    
    
    
                logger.info("handle record success");
            }
            
            
            
            
        }
        FtpUtil.closeFtp(fromFTP);
        FtpUtil.closeFtp(toFTP);
        logger.info("file job success");
    }
    
    public static void main(String[] args) {
        try {
            new FileJob().execute(null);
        } catch (JobExecutionException e) {
            e.printStackTrace();
        }
    }
}
